JavaScript 中存在一个特殊的全局对象,可以在任意位置被访问,通常用 globalThis 指代。

在浏览器中,指向 window 这个全局对象,而 Node.js 中指向 global

当我们直接使用一些无需定义的方法时 (例如 consolesetTimeout 等),它们都是 global (Global objects) 上的属性。

| 浏览器 | Node.js | | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | | | |

我们可以直接在上面挂载变量,这样在全局任意地方都可以访问。

js global.userInfo = { name: 'xm', age: 18 }

上面也内置了许多的方法,我们可以通过 Object.getOwnPropertyNames(global) 简单获取打印一下观察一下。

js console.log(Object.getOwnPropertyNames(global))

可以看到很多熟悉的面孔都在上面挂载着。

1 特殊的全局变量

主要就是指 __filename__dirname

1.1 __filename

__filename 表示当前正在执行的脚本文件的绝对路径。

1.2 __dirname

__dirname 表示当前执行脚本所在目录的绝对路径。

1.3 使用示例

将用下面的代码做一下验证。

```js // 分别存在于如下2个文件中 // a/df.js // df.js

console.log(__filename) console.log(__dirname) ```

执行结果如下。

1.4 注意事项

这 2 个变量,只在 CJS 模块下存在,如果是 ESM 将会出现以下的报错信息。

sh ReferenceError: __dirname is not defined in ES module scope

ESM 中如果获取这 2 个变量与 require 方法需要使用如下方式,详见:ESM 中使用 CJS 模块特有的变量和方法

```ts import { fileURLToPath } from 'url' import { dirname } from 'path' import { createRequire } from 'module'

const __filename = fileURLToPath(import.meta.url) const __dirname = dirname(__filename)

console.log('__filename', __filename) console.log('__dirname', __dirname)

const require = createRequire(import.meta.url) console.log('name', require('./package.json').name) ```

2 常用 global 属性

除了在浏览器里常用的 consolesetTimeout 等等通用的方法外,下面介绍一些独有且常用的。

2.1 process

process 对象提供了与当前 Node.js 进程相关的信息和控制方法,下面是一些常用的 process 属性。

process.argv 返回一个数组,包含启动 Node.js 进程时传递的命令行参数。

js console.log(process.argv)

第一个参数是 Node 在机器上的位置,

第二个参数是执行文件的绝对路径,

后续参数都为用户传递的自定义参数。

process.cwd() 获取当前工作目录的绝对路径。

js console.log(process.cwd())

process.env 获取当前执行环境的环境变量 (对象形式)。

js console.log(process.env)

简单场景这个环境变量可以通过执行命令的时候直接设置 (如下),

process.version 获取当前 Node 版本。

sh node -e "console.log(process.version)"

process.exit([code]):终止 Node.js 进程,如果指定了 code 参数,则使用该参数作为退出状态码。

```js console.log('hello')

process.exit()

// 下面这行代码不会执行 console.log('world') ```

在终端里可以通过 echo $? 获取传递的退出状态码。

js console.log('hello') process.exit(1)

process.stdout:标准输出流,常用 process.stdout.write 进行数据写入。

js process.stdout.write('hello') process.stdout.write(' ') process.stdout.write('world') process.stdout.write('\n')

通过它我们可以进行不换行的内容输出,

process.stdin:用于从标准输入流 (stdin) 读取数据。

js // 监听用户输入数据 process.stdin.on('data', (data) => { console.log(`User input: ${data}`); });

2.2 Buffer

Buffer 用于处理二进制数据。类似于数组,并提供了一些方便的方法来操作二进制数据。

下面是一些常见用法。

① 创建 Buffer 对象

javascript const buf = Buffer.alloc(10); // 创建一个大小为 10 的 Buffer 对象,默认会用 0 填充 const buf2 = Buffer.from('Hello, world!'); // 创建一个包含字符串 'Hello, world!' 的 Buffer 对象 const buf3 = Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]); // 内容为hello构成的16进制数组 Buffer 对象

② 转换内容格式

```js const buf = Buffer.from('Hello, world!'); // 转为字符串输出 console.log(buf.toString()); // 输出 'Hello, world!'

// 转为16进制字符串输出 console.log(buf.toString('hex')); // 输出 '48656c6c6f2c20776f726c6421'(对应的是 'Hello, world!' 的 ASCII 码)

// 转为数组输出 console.log(Array.from(buf)); // 输出 [ // 72, 101, 108, 108, 111, // 44, 32, 119, 111, 114, // 108, 100, 33 // ]

// 转为base64格式输出 console.log(buf.toString('base64')); // 输出 'SGVsbG8sIHdvcmxkIQ==' ```

③ 写入内容

```javascript // 创建一个长度为 10 的 Buffer 实例并将它填充为 0 const buf = Buffer.alloc(10);

// 将字符串 'Hello' 写入 Buffer 实例的前 5 个字节 buf.write('Hello');

// 将字符串 'world' 写入 Buffer 实例的第 6 个字节开始的位置,由于 'world' 的长度为 5,所以不会覆盖掉之前写入的 'Hello' buf.write('world', 5);

// 将 Buffer 实例转换为字符串并输出 'Hello world' console.log(buf.toString()); ```

④ 合并多个 Buffer 对象

js const buf1 = Buffer.from('Hello'); const buf2 = Buffer.from('World'); const buf3 = Buffer.concat([buf1, buf2]); console.log(buf3.toString()); // 输出 'HelloWorld'

⑤ 截取 Buffer 对象

js const buf = Buffer.from('Hello, world!'); const buf2 = buf.slice(0, 5); console.log(buf2.toString()); // 输出 'Hello'

小结

本节先简单介绍了一下 globalThis 的用法和作用,在 Node.js 中 globalThis === global

紧接着介绍了 2 个特殊的全局变量 __filename (正在执行的脚本文件的绝对路径),__dirname (当前执行脚本所在目录的绝对路径),以及如在 ESM 模块系统中获取。

global 上有的方法和属性,主要介绍了 processBuffer